package com.atguigu.spzx.common.handler;

import com.atguigu.spzx.model.exception.SpzxException;
import com.atguigu.spzx.model.vo.common.R;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice//异常处理返回的结果转为json响应
@Slf4j
public class SpzxGlobalExceptionHandler {


    //编写异常处理方法：
    @ExceptionHandler(value = Exception.class)//Exception类型的异常的处理器
    //当Controller中的接口出现异常时，该方法会代替controller接口执行并返回结果
    public R exception(Exception exception){
        //....
        //捕获系统/框架提供的异常信息，默认异常类中只有message获取获取异常信息
        //但是我们希望给前端的失败的R对象中除了异常信息 还需要异常状态码
        //可以通过自定义异常的方式 携带自定义属性
        log.error("出现异常:{}" ,ExceptionUtils.getStackTrace(exception) );
        //获取异常对象的堆栈消息转为字符串输出
//        System.out.println(ExceptionUtils.getMessage(exception));
        return R.fail();//响应默认异常  -1
    }
    //自定义异常处理器：我们希望获取自定义异常的code message创建R对象响应
    @ExceptionHandler(value = SpzxException.class)
    public R exception(SpzxException exception){
        Throwable e = exception.getE();
        if(e!=null){
            //获取真正的异常对象的堆栈日志输出
            log.error("出现异常:{}" ,ExceptionUtils.getStackTrace(e) );
        }
        return R.setResult(exception.getCode(),exception.getMessage());
    }
}
